package org.mysofts.eclipseman.util;

import java.text.MessageFormat;
import java.util.HashMap;
import java.util.Map;

/**
 * Provider de messages.
 * 
 * @author reda
 * 
 * @version $Revision: 1.0 $
 */
public final class MessageProvider { // $codepro.audit.disable
										// declareDefaultConstructors
	// [start] static fields
	/**
	 * Map des instance, chaque instance est liée à son path.
	 */
	private static final Map<String, MessageProvider> INSTANCES;
	// [end]

	// [start] instance fields
	/**
	 * Chemin du fournisseur de messages.
	 */
	private final String path;
	// [end]

	// [start] constructors
	static {
		final int initialCapacity = 10; // $codepro.audit.disable
										// numericLiterals
		final float loadFactor = 0.75f; // $codepro.audit.disable
										// numericLiterals
		INSTANCES = new HashMap<String, MessageProvider>(initialCapacity,
				loadFactor);
	}

	/**
	 * Constructor.
	 * 
	 * @param path
	 *            Prefixe complet.
	 */
	private MessageProvider(final String path) {
		this.path = path;
	}

	// [end]

	// [start] instance methods
	/**
	 * Retourne un fournisseur de messages enfants.
	 * 
	 * @param name
	 *            Nom de l'enfant.
	 * 
	 * @return {@link MessageProvider} avec ce nom.
	 */
	public MessageProvider sub(final String name) {
		final String childPath = MessageFormat.format("{0}.{1}", this.path,
				name);
		return get(childPath);
	}

	/**
	 * Retourne la valeur du message.
	 * 
	 * 
	 * @return Valeur du message.
	 */
	public String value() {
		return MessagesBundle.getString(this.path);
	}

	/**
	 * Method toString.
	 * 
	 * @return String
	 */
	@Override
	public String toString() {
		return this.value();
	}

	// [end]

	// [start] static methods
	/**
	 * Retourne un fournisseur de message à partir de son path.
	 * 
	 * @param path
	 *            Path du fournisseur.
	 * 
	 * @return Fournisseur de messages.
	 */
	public static MessageProvider get(final String path) {
		MessageProvider child = INSTANCES.get(path);
		if (child == null) {
			child = new MessageProvider(path);
			INSTANCES.put(path, child);
		} // end if

		return child;
	}
	// [end]
}
